使用 receive 和 fallback 這兩個特殊的回調函數來處理接收以太幣和處理不存在的函數調用,主要用於以下兩種情況。
當其他用戶向你的合約發送以太幣時,receive 函數會被調用。
當用戶調用了合約中不存在的函數時,fallback 函數會被觸發。
receive 用於處理接收以太幣,一個合約最多只能有一個 receive,聲明方式與一般函數不同,不需要 function 關鍵字。
receive 不能帶有任何參數,不能返回任何值,必須同時包含 external 和 payable 關鍵字。
當合約接收以太幣時,receive 函數會被觸發。通常情況下,你應該在 receive 函數中執行簡單的操作,因為如果用戶使用 send 或 transfer 方法發送以太幣,gas 限制為 2300,複雜的邏輯可能導致 "Out of Gas" 錯誤。如果你需要更複雜的邏輯,可以使用 call 方法並自定義 gas。
fallback 函數用於處理不存在的函數調用,或者在代理合約中使用。fallback 函數會在調用合約中不存在的函數時被觸發。通常情況下,你應該將 fallback 函數聲明為 external 和 payable,以便能夠接收以太幣。
需要注意的是,receive 和 fallback 的區別在於觸發條件。當合約接收以太幣時,如果 msg.data 為空且存在 receive 函數,將觸發 receive;如果 msg.data 不為空或不存在 receive 函數,將觸發 fallback 函數。如果這兩個函數都不存在,直接向合約發送以太幣將導致錯誤(你仍然可以使用帶有 payable 標記的函數向合約發送以太幣)。